package com.sheng.leetcode.year2023.month05.day12;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/05/12
 * <p>
 * 1330. 翻转子数组得到最大的数组值<p>
 * <p>
 * 给你一个整数数组 nums 。「数组值」定义为所有满足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。<p>
 * 你可以选择给定数组的任意子数组，并将该子数组翻转。但你只能执行这个操作 一次 。<p>
 * 请你找到可行的最大 数组值 。<p>
 * <p>
 * 示例 1：<p>
 * 输入：nums = [2,3,1,5,4]<p>
 * 输出：10<p>
 * 解释：通过翻转子数组 [3,1,5] ，数组变成 [2,5,1,3,4] ，数组值为 10 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：nums = [2,4,9,24,2,1,10]<p>
 * 输出：68<p>
 * <p>
 * 提示：<p>
 * 1 <= nums.length <= 3*10^4<p>
 * -10^5 <= nums[i] <= 10^5<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/reverse-subarray-to-maximize-array-value">1330. 翻转子数组得到最大的数组值</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1330 {

    @Test
    public void test01() {
        int[] nums = {2, 3, 1, 5, 4};
//        int[] nums = {2, 4, 9, 24, 2, 1, 10};
        System.out.println(new Solution().maxValueAfterReverse(nums));
    }
}

class Solution {
    public int maxValueAfterReverse(int[] nums) {
        int base = 0, d = 0, n = nums.length;
        int mx = Integer.MIN_VALUE, mn = Integer.MAX_VALUE;
        for (int i = 1; i < n; i++) {
            int a = nums[i - 1], b = nums[i];
            int dab = Math.abs(a - b);
            base += dab;
            mx = Math.max(mx, Math.min(a, b));
            mn = Math.min(mn, Math.max(a, b));
            d = Math.max(d, Math.max(Math.abs(nums[0] - b) - dab, // i=0
                    Math.abs(nums[n - 1] - a) - dab)); // j=n-1
        }
        return base + Math.max(d, 2 * (mx - mn));
    }
}

//作者：endlesscheng
//链接：https://leetcode.cn/problems/reverse-subarray-to-maximize-array-value/solution/bu-hui-hua-jian-qing-kan-zhe-pythonjavac-c2s6/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
